home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dr. Windows 3
/
dr win3.zip
/
dr win3
/
WINPROGS
/
UPC12BS1.ZIP
/
LIB
/
NDIRWIN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-31
|
6KB
|
177 lines
/*--------------------------------------------------------------------*/
/* n d i r w i n . c */
/* */
/* UUPC/extended directory search routine for MS-Windows 3.x */
/* environment. */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* Changes Copyright (c) 1993 by Robert Denny */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* Changes Copyright (c) 1989-1993 by Kendra Electronic */
/* Wonderworks. */
/* */
/* All rights reserved except those explicitly granted by */
/* the UUPC/extended license agreement. */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* RCS Information */
/*--------------------------------------------------------------------*/
/*
* $Id: ndirwin.c 1.2 1993/07/31 16:22:16 ahd Exp $
*
* Revision history:
* $Log: ndirwin.c $
* Revision 1.2 1993/07/31 16:22:16 ahd
* Changes in support of Robert Denny's Windows 3.x support
*
* Revision 1.1 1993/07/22 23:19:50 ahd
* Initial revision
*
*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <dir.h>
#include <dos.h>
#include <errno.h>
#include <time.h>
/*--------------------------------------------------------------------*/
/* UUPC/extended include files */
/*--------------------------------------------------------------------*/
#include "lib.h"
#include "uundir.h"
#include "dos2unix.h"
#define USHORT unsigned short
static char *pathname = NULL;
static struct ffblk findbuf;
currentfile();
/*--------------------------------------------------------------------*/
/* o p e n d i r x */
/* */
/* Open a directory */
/*--------------------------------------------------------------------*/
extern DIR *opendirx( const char *dirname, char *pattern)
{
DIR *dirp;
USHORT rc;
pathname = malloc( strlen( dirname ) + strlen( pattern ) + 2 );
strcpy(pathname, dirname);
if ((*pattern != '/') && (dirname[ strlen(dirname) - 1] != '/'))
strcat(pathname,"/");
strcat(pathname,pattern);
printmsg(5,"opendir: Opening directory %s", pathname );
/*--------------------------------------------------------------------*/
/* Read the first file in the directory */
/*--------------------------------------------------------------------*/
rc = findfirst( pathname, &findbuf, FA_NORMAL);
/*--------------------------------------------------------------------*/
/* Process the return code from the first file */
/*--------------------------------------------------------------------*/
if ( rc == 0 )
{
dirp = malloc( sizeof( DIR ));
dirp->dirfirst = 1;
strcpy(dirp->dirid, "DIR");
return dirp;
}
else
{
if (( rc != ENMFILE ) && ( rc != ENOENT ))
printmsg(4,"opendir: Error %d on directory %s",
(int) rc, pathname );
return NULL;
} /* else */
} /*opendir*/
/*--------------------------------------------------------------------*/
/* r e a d d i r */
/* */
/* Get next entry in a directory */
/*--------------------------------------------------------------------*/
struct direct *readdir(DIR *dirp)
{
USHORT rc = 0;
if ( ! equal(dirp->dirid, "DIR" ))
{
printmsg(0,"readdir: No directory open to read");
panic();
}
if (dirp->dirfirst)
{
printmsg(5,"readdir: Opening directory %s", pathname );
dirp->dirfirst = 0;
}
else
rc = findnext(&findbuf);
if ( rc == 0 )
{
dirp->dirent.d_ino = -1; /* no inode information */
strlwr(strcpy(dirp->dirent.d_name, findbuf.ff_name ));
dirp->dirent.d_namlen = strlen(findbuf.ff_name);
dirp->dirent.d_reclen = sizeof(struct direct) - (MAXNAMLEN + 1) +
((((dirp->dirent.d_namlen + 1) + 3) / 4) * 4);
dirp->dirent.d_modified = dos2unix( *((FDATE *) &findbuf.ff_fdate),
*((FTIME *) &findbuf.ff_ftime));
printmsg(4,"readdir: Returning \"%s\"", dirp->dirent.d_name);
return &(dirp->dirent);
}
else {
if (( errno != ENMFILE ) && ( errno != ENOENT ))
printmsg(0,"readdir: Error %d on directory %s",
(int) rc, pathname );
return NULL;
} /* else */
} /*readdir*/
/*--------------------------------------------------------------------*/
/* c l o s e d i r */
/* */
/* Close a directory */
/*--------------------------------------------------------------------*/
void closedir(DIR *dirp)
{
if ( ! equal(dirp->dirid, "DIR" ))
{
printmsg(0,"closedir: No directory open");
panic();
}
printmsg(5,"closedir: Closing directory %s", pathname );
free( dirp );
dirp = NULL;
free( pathname );
pathname = NULL;
} /*closedir*/